#include "hc32f460.h"
#include <rtdef.h>
#include <rtthread.h>
#include "led.h"
#include "stdbool.h"

port_init_t LED_Config[] =
{
                //PORT      PIN    FUNC      Mode         LTE     INTE   INVE    PUU     DRV         NOD          BFE    Level
        {.enPort = GPIO_PORT_C, GPIO_PIN_00, GPIO_FUNC_0, HIGH , PIN_DIR_OUT, PIN_OUT_TYPE_CMOS, false, false, false, false,  false,  false}, // 14.PC0 WARNYEE 异常黄灯
        {.enPort = GPIO_PORT_C, GPIO_PIN_01, GPIO_FUNC_0, HIGH , PIN_DIR_OUT, PIN_OUT_TYPE_CMOS, false, false, false, false,  false,  false}, // 14.PD0 WARNRED 异常红灯
        {.enPort = GPIO_PORT_C, GPIO_PIN_02, GPIO_FUNC_0, HIGH , PIN_DIR_OUT, PIN_OUT_TYPE_CMOS, false, false, false, false,  false,  false}, // 14.PD2 STAGRE  状态绿灯         
        {.enPort = GPIO_PORT_C, GPIO_PIN_03, GPIO_FUNC_0, HIGH , PIN_DIR_OUT, PIN_OUT_TYPE_CMOS, false, false, false, false,  false,  false}, // 14.PD1 STARED 状态红灯
        {.enPort = GPIO_PORT_D, GPIO_PIN_10, GPIO_FUNC_0, HIGH , PIN_DIR_OUT, PIN_OUT_TYPE_CMOS, false, false, false, false,  false,  false}, // 14.PC12 LED UP 上行通信
        {.enPort = GPIO_PORT_D, GPIO_PIN_09, GPIO_FUNC_0, HIGH , PIN_DIR_OUT, PIN_OUT_TYPE_CMOS, false, false, false, false,  false,  false}, // 14.PC11 LED DOWN 下行通信
        {.enPort = GPIO_PORT_D, GPIO_PIN_08, GPIO_FUNC_0, HIGH , PIN_DIR_OUT, PIN_OUT_TYPE_CMOS, false, false, false, false,  false,  false}, // 14.PD08 LED PWR 
        {.enPort = GPIO_PORT_B, GPIO_PIN_15, GPIO_FUNC_0, LOW  , PIN_DIR_OUT, PIN_OUT_TYPE_CMOS, false, false, false, false,  false,  false}, // 14.PD08 LEDRUN
        {.enPort = GPIO_PORT_A, GPIO_PIN_05, GPIO_FUNC_0, LOW  , PIN_DIR_OUT, PIN_OUT_TYPE_NMOS, false, false, false, false,  false,  false}, // 14.PA5 CVLED
};


static rt_err_t gpio_init(rt_device_t dev)
{
    InitGPIO(&LED_Config[0],sizeof(LED_Config)/sizeof(port_init_t));
    return RT_EOK;
}

/* 设备的控制函数（设置模式/读取状态等） */
static rt_err_t gpio_control(rt_device_t dev, int cmd, void *args)
{
    struct my_gpio_device *gpio = (struct my_gpio_device *)dev;
    
    switch (cmd)
    {    
        case 0: // 写引脚电平
//            (args == 0)? PORT_ResetPortData(gpio->gpio.enPort,gpio->gpio.u16Pin):PORT_SetPortData(gpio->gpio.enPort,gpio->gpio.u16Pin);
            break;
            
        case 1: // 读引脚电平
//            *(rt_base_t *)args = PORT_GetBit(gpio->gpio.enPort,(en_pin_t)gpio->gpio.u16Pin);
            break;
        
        case 2: //翻转电平
//            PORT_Toggle(gpio->gpio.enPort, gpio->gpio.u16Pin);
            break;
        default:
            return -RT_ENOSYS;
    }
    return RT_EOK;
}

struct rt_device_ops Ledops=
{
    .init      = gpio_init,
    .open      = RT_NULL,
    .close     = RT_NULL,
    .read      = RT_NULL,
    .write     = RT_NULL,
    .control   = RT_NULL,//gpio_control,
};

int Led_gpio_device_register(void)
{
    // 1. 动态分配内存
    gpio_device *gpio_dev = (gpio_device *)rt_malloc(sizeof(gpio_device));
    if (gpio_dev == RT_NULL)
    {
        rt_kprintf("Error: No memory for GPIO device!\n");
        return -RT_ENOMEM;
    }

    // 2. 初始化设备结构体
    memset(&gpio_dev->parent, 0, sizeof(struct rt_device));

    gpio_dev->parent.type   = RT_Device_Class_Char;
    gpio_dev->parent.ops    = &Ledops;
    gpio_dev->parent.user_data = gpio_dev;

    // 3. 注册设备
    int result = rt_device_register(&gpio_dev->parent, "led_gpio", RT_DEVICE_FLAG_RDWR);
    if (result != RT_EOK)
    {
        rt_kprintf("Error: Device registration failed (%d)!\n", result);
        rt_free(gpio_dev);
        return result;
    }

    return RT_EOK;
}

// 设备注销函数
void Led_gpio_device_unregister(void)
{
    rt_device_t dev = rt_device_find("led_gpio");
    if (dev)
    {
        rt_device_unregister(dev);
        rt_free(dev->user_data);
    }
}

/*设备向系统中注册*/
INIT_DEVICE_EXPORT(Led_gpio_device_register);